Skip to content

[pull] main from MetaMask:main#643

Merged
pull[bot] merged 25 commits intoReality2byte:mainfrom
MetaMask:main
Mar 31, 2026
Merged

[pull] main from MetaMask:main#643
pull[bot] merged 25 commits intoReality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 31, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

metamaskbot and others added 25 commits March 30, 2026 15:02
…dpoint cp-7.71.1 cp-7.72.0 (#28098)

- fix: point DIGEST_API_URL to production endpoint (#28088)

## **Description**

<!-- 1. What is the reason for the change? The fallback URL for
`DIGEST_API_URL` was pointing at the development endpoint. -->
<!-- 2. What is the improvement/solution? Switch the hardcoded fallback
to the production endpoint so that builds without an explicit env var
hit production. -->

Switches the hardcoded fallback value for `DIGEST_API_URL` in
`AppConstants.ts` from the dev endpoint
(`digest.dev-api.cx.metamask.io`) to the production endpoint
(`digest.api.cx.metamask.io`).

Also moves the `@metamask/sdk-communication-layer` import to the top of
the file to follow alphabetical import ordering.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding

Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling

guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->

Made with [Cursor](https://cursor.com)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: only changes a constant fallback URL and import ordering.
Main impact is that builds without `DIGEST_API_URL` will now call the
production digest service instead of the dev endpoint.
> 
> **Overview**
> Updates `AppConstants.DIGEST_API_URL` to default to the production
`https://digest.api.cx.metamask.io/api/v1` endpoint when the
`DIGEST_API_URL` env var is not set.
> 
> Also reorders the `DEFAULT_SERVER_URL` import to match expected import
ordering.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9d584a4. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
[8603e1c](8603e1c)

Co-authored-by: Xavier Brochard <xavier.brochard@consensys.net>
This PR updates the change log for 7.71.1. (Hotfix - no test plan
generated.)

---------

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: chloeYue <chloe.gao@consensys.net>
- Keep ## [7.71.1] hotfix + full ## [7.71.0] from stable.
- Footer: [Unreleased] v7.71.1...HEAD; [7.71.1] v7.71.0...v7.71.1; [7.71.0] unchanged.
- Normalize Predict withdraw bullet to ASCII apostrophe.

Made-with: Cursor
…ne (#27532)

Revert ASCII normalization for stable-merge conflict resolution.

Made-with: Cursor
# 🚀 v7.71.1 Testing & Release Quality Process

Hi Team,
As part of our new **MetaMask Release Quality Process**, here’s a quick
overview of the key processes, testing strategies, and milestones to
ensure a smooth and high-quality deployment.

---

## 📋 Key Processes

### Testing Strategy
- **Developer Teams:**
Conduct regression and exploratory testing for your functional areas,
including automated and manual tests for critical workflows.
- **QA Team:**
Focus on exploratory testing across the wallet, prioritize high-impact
areas, and triage any Sentry errors found during testing.
- **Customer Success Team:**
Validate new functionalities and provide feedback to support release
monitoring.

### GitHub Signoff
- Each team must **sign off on the Release Candidate (RC)** via GitHub
by the end of the validation timeline (**Tuesday EOD PT**).
- Ensure all tests outlined in the Testing Plan are executed, and any
identified issues are addressed.

### Issue Resolution
- **Resolve all Release Blockers** (Sev0 and Sev1) by **Tuesday EOD
PT**.
- For unresolved blockers, PRs may be reverted, or feature flags
disabled to maintain release quality and timelines.

### Cherry-Picking Criteria
- Only **critical fixes** meeting outlined criteria will be
cherry-picked.
- Developers must ensure these fixes are thoroughly reviewed, tested,
and merged by **Tuesday EOD PT**.

---

## 🗓️ Timeline and Milestones

1. **Today (Friday):** Begin Release Candidate validation.
2. **Tuesday EOD PT:** Finalize RC with all fixes and cherry-picks.
3. **Wednesday:** Buffer day for final checks.
4. **Thursday:** Submit release to app stores and begin rollout to 1% of
users.
5. **Monday:** Scale deployment to 10%.
6. **Tuesday:** Full rollout to 100%.

---

## ✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox
below to track signoff completion:

# Team sign-off checklist
- [ ] Mobile Platform

This process is a major step forward in ensuring release stability and
quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

# Reference
- Testing plan sheet -
https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372
This PR syncs the stable branch to main for version 100.10.0.

*Synchronization Process:*

- Fetches the latest changes from the remote repository
- Resets the branch to match the stable branch
- Attempts to merge changes from main into the branch
- Handles merge conflicts if they occur

*File Preservation:*

Preserves specific files from the stable branch:
  - CHANGELOG.md
  - bitrise.yml
  - android/app/build.gradle
  - ios/MetaMask.xcodeproj/project.pbxproj
  - package.json

  Indicates the next version candidate of main to 100.10.0
…nalytics from useMetrics to useAnalytics (#27984)

---

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Migrates analytics calls in security and wallet UI components from the
deprecated `useMetrics` hook (and its `withAnalyticsAwareness` HOC) to
the new `useAnalytics` hook and direct `analytics` module.

This is part of the broader C3 analytics migration (#26686). The changes
cover:

- **Hook-based components** (`BackupAlert`, `BalanceEmptyState`,
`Carousel`, `OTAUpdatesModal`, `OptinMetrics`, `ScreenshotDeterrent`,
`UpdateNeeded`, `ProtectWalletMandatoryModal`): replace `useMetrics()`
with `useAnalytics()`
- **Class-based components** (`ProtectYourWalletModal`, `ErrorBoundary`,
`AdvancedSettings`, `GeneralSettings`): replace the
`withAnalyticsAwareness` HOC injection with direct imports of
`analytics` and `AnalyticsEventBuilder`
- **Tests**: update mock patterns from `useMetrics` to `useAnalytics`,
using `jest.mocked()` and `createMockUseAnalyticsHook` where appropriate

No behaviour changes — the analytics events fired are identical.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Refs: #26814

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Primarily a mechanical analytics refactor, but it touches multiple
security/onboarding and error-reporting surfaces where incorrect event
building could silently break telemetry or consent-related tracking.
> 
> **Overview**
> Migrates analytics instrumentation across several wallet/security UI
surfaces from deprecated `useMetrics` and HOC-injected analytics props
to the new `useAnalytics` hook and direct `analytics` +
`AnalyticsEventBuilder` usage (notably in class components like
`ErrorBoundary`, settings screens, and `ProtectYourWalletModal`).
> 
> Updates analytics trait APIs to use `identify` (replacing
`addTraitsToUser`) and adjusts how queued onboarding events are rebuilt
before tracking in `OptinMetrics`.
> 
> Refactors unit tests and Jest mocks accordingly, standardizing on
`createMockUseAnalyticsHook` and updating expectations to match the new
event object shape/constants (e.g., `MetaMetricsEvents` usage and
`saveDataRecording` changes).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1faf069. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Adds **opt-in** developer tooling so Money Movement / RAMPS engineers
can stream `RampsController` state and calls to a local browser
dashboard without loading the bridge for every dev build.

- **`RAMPS_DEBUG_DASHBOARD=true`** in `.js.env` + Metro restart enables
the bridge; **`RAMPS_DEBUG_DASHBOARD_URL`** overrides the WebSocket URL
(devices/emulators).
- **Dynamic `import()`** from `ramps-controller-init.ts` so the bridge
(including fetch instrumentation) is omitted from the bundle unless
enabled.
- **`app/components/UI/Ramp/debug/README.md`** — setup, `adb reverse`,
env vars.
- **`ramps-debug-dashboard/`** — self-contained Node server (`npm ci` +
`node server.mjs`); session logs gitignored.
- Includes prior commit on this branch: **CODEOWNERS** paths for Money
Movement (`@MetaMask/money-movement`) and **`ramps-debug-dashboard/`**
entry.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: RAMPS debug dashboard

  Scenario: Dashboard receives data when opt-in env is set
    Given a debug build with RAMPS_DEBUG_DASHBOARD=true in .js.env and Metro restarted
    And ramps-debug-dashboard is running (npm ci && node server.mjs)
    When the app launches and RampsController is active
    Then the browser UI at http://localhost:8099 shows state/method traffic
    And Metro logs include a RampsDebug connected message
```

## **Screenshots/Recordings**

<div>
<a href="https://www.loom.com/share/4644574b45ae42e6beda7d17b627a6ca">
      <p>Ramps Debug Dashboard - Watch Video</p>
    </a>
<a href="https://www.loom.com/share/4644574b45ae42e6beda7d17b627a6ca">
<img style="max-width:300px;"
src="https://cdn.loom.com/sessions/thumbnails/4644574b45ae42e6beda7d17b627a6ca-cc0038d0a8a8afd5-full-play.gif#t=0.1">
    </a>
  </div>

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Dev-only code now conditionally patches `fetch` and wraps
`RampsController` methods when `RAMPS_DEBUG_DASHBOARD=true`, which could
affect local debugging behavior if enabled. Production behavior should
remain unchanged due to `__DEV__` gating and optional `require`.
> 
> **Overview**
> Adds an **opt-in, `__DEV__`-only** “RAMPS debug dashboard” that
streams `RampsController` state changes, method calls (with
timing/cache-hit heuristics), and selected ramps-related `fetch` traffic
to `ws://localhost:8099`.
> 
> Introduces a self-contained host dashboard under
`scripts/money-movement/debug-dashboard/` (Node HTTP+WebSocket server,
JSONL session logging, and `yarn ramps:debug-dashboard` runner) plus new
docs and env var guidance in `.js.env.example`.
> 
> Updates `ramps-controller-init` to conditionally `require` and
initialize the bridge when `RAMPS_DEBUG_DASHBOARD=true`, adds Jest
coverage for that gating, and excludes the new debug tooling from Sonar
coverage and the security code scanner.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b8ed425. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Increase Check bundle size CI step from 53 to 54. PRs that are adding
new libraries are blocked by this constraint.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk workflow-only change; it solely relaxes a CI guardrail and
could allow slightly larger bundles to merge without review.
> 
> **Overview**
> In `.github/workflows/ci.yml`, **relaxes the `JS bundle size check`
gate** by increasing the allowed `ios/main.jsbundle` size threshold from
`53` to `54` when running `./scripts/js-bundle-stats.sh`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
74e8abd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

adding dev options for money account deposit / withdraw

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/CONF-1109

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**
<img width="392" height="850" alt="Screenshot 2026-03-26 at 8 48 07 PM"
src="https://github.com/user-attachments/assets/ea37bd84-2eba-41c2-83ca-7835f9b97047"
/>

## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [X] I've included tests if applicable
- [X] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [X] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: changes are confined to developer-only confirmation triggers
and new feature-flag selectors/registry defaults, gated behind remote
flags defaulting to false.
> 
> **Overview**
> Adds two new developer-only confirmation triggers, **Money Account
Deposit** and **Money Account Withdraw**, which appear in
`ConfirmationsDeveloperOptions` only when corresponding remote feature
flags are enabled and create a Polygon transaction batch (proxy `value`
tx + USDC.e `transfer`) using
`TransactionType.moneyAccountDeposit`/`moneyAccountWithdraw`.
> 
> Introduces `moneyAccount` remote-flag selectors
(`selectMoneyAccountDepositEnabledFlag`,
`selectMoneyAccountWithdrawEnabledFlag`), registers the new
`moneyAccount` flag with default-disabled values in the E2E feature flag
registry, and extends unit tests and `testIds` to cover flag-gated
rendering and button press behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5c9502e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#28150)

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Adds temporary (non-destructive) versions of the TestFlight upload and
nightly build workflows to test the ephemeral build branch pattern
without modifying the production workflows.

**New files:**
- **`create-build-branch.yml`** — Reusable workflow that creates an
ephemeral `build/<source>-<timestamp>` branch from a source ref,
avoiding version-bump pushes to protected branches like `main`
- **`upload-to-testflight-temp.yml`** — Copy of
`upload-to-testflight.yml` with: `workflow_call` support, ephemeral
branch via `create-build-branch.yml`, build number in the summary
- **`nightly-build-temp.yml`** — Copy of `nightly-build.yml` refactored
to: run on cron schedule instead of push-triggered, call
`upload-to-testflight-temp.yml` for iOS exp/rc, use
`create-build-branch.yml` + `build.yml` for Android exp/rc

**Also updated:**
- **`CODEOWNERS`** — Added explicit `@MetaMask/mobile-platform`
ownership for `create-build-branch.yml`

The originals (`upload-to-testflight.yml`, `nightly-build.yml`) are
**unchanged**.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

N/A — CI workflow changes only. Verify by triggering
`upload-to-testflight-temp` or `nightly-build-temp` via
`workflow_dispatch` and confirming the ephemeral branch is created,
build succeeds, and branch is cleaned up.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->

Made with [Cursor](https://cursor.com)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Adds new scheduled and reusable GitHub Actions workflows that
create/push/delete ephemeral branches and fetch Apple credentials from
AWS; misconfiguration could affect CI runs or repo branches, but
production workflows are unchanged.
> 
> **Overview**
> Introduces a reusable `create-build-branch.yml` workflow that creates
and pushes an ephemeral `build/<source>-<timestamp>` branch for
version-bump commits, avoiding direct pushes to protected refs.
> 
> Adds temporary workflows to exercise this pattern:
`upload-to-testflight-temp.yml` builds iOS from the ephemeral branch,
uploads the IPA to TestFlight using Apple API keys fetched via AWS
OIDC/Secrets Manager, and then deletes the build branch;
`nightly-build-temp.yml` runs on a daily cron to trigger iOS (exp then
rc) and Android (exp then rc) builds using ephemeral branches and
performs Android branch cleanup.
> 
> Updates `CODEOWNERS` to assign `@MetaMask/mobile-platform` ownership
for `create-build-branch.yml`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b98371a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR adds Google Wallet (Android) in-app provisioning support for the
MetaMask Card feature. Users can now add their MetaMask Card directly to
Google Wallet from within the app.

### What is the reason for the change?
Users currently cannot add their MetaMask Card to Google Wallet directly
from the app. They need to manually add the card through the Google
Wallet app, which provides a suboptimal user experience.

### What is the improvement/solution?
- Implements `GoogleWalletAdapter` that integrates with the
`@expensify/react-native-wallet` library for Android
- Updates the `providers.ts` factory to return `GoogleWalletAdapter` for
Android platform
- Adds CI/CD pipeline changes to clone the private TapAndPay SDK before
Android builds (GitHub Actions and Bitrise)
- Configures `react-native.config.js` to conditionally enable the wallet
library only when the SDK is present
- Updates `android/build.gradle` to include a local Maven repository for
the TapAndPay SDK

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Added Google Wallet in-app provisioning for MetaMask
Card on Android

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Google Wallet In-App Provisioning

  Scenario: User adds MetaMask Card to Google Wallet
    Given user is logged in and has an active MetaMask Card
    And user is on the Card Home screen on an Android device
    And the "Add to Google Wallet" button is visible

    When user taps on "Add to Google Wallet" button
    Then the Google Wallet provisioning flow is initiated
    And user completes the Google Wallet verification
    And the card is added to Google Wallet
    And a success toast is displayed

  Scenario: User sees disabled button when card is already in wallet
    Given user is logged in and has an active MetaMask Card
    And the card is already added to Google Wallet

    When user navigates to the Card Home screen
    Then the "Add to Google Wallet" button is not visible
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Introduces new Google Wallet provisioning flow and CI logic to fetch a
private Tap-and-Pay SDK, which can affect Android build/release behavior
and wallet tokenization edge cases.
> 
> **Overview**
> Enables **Google Wallet (Android) in-app provisioning** for MetaMask
Card by adding a new `GoogleWalletAdapter` (including “Yellow Path”
*resume* handling via token lookup/listing) and exporting it through the
push provisioning adapter factory.
> 
> Updates Card Home push-provisioning inputs to use a KYC-derived
cardholder name (and passes `accountCreatedAt`), swaps in a new
cross-platform `AddToWalletButton` component (native on iOS, localized
SVG button on Android), and adjusts the Galileo adapter contract to
return only the `opaquePaymentCard` needed for Google provisioning.
> 
> Adds Android build support for the private Tap-and-Pay SDK: GitHub
Actions optionally clones the SDK into `android/libs`,
`android/build.gradle` adds a local Maven repo, and `android/libs` is
gitignored.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7273028. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
## **Description**

This PR migrates React Navigation from v5 to v6. This is a significant
infrastructure update that modernizes the navigation layer of the
application to align with the latest React Navigation best practices and
removes deprecated APIs.

Why this change?
- React Navigation v5 is no longer actively maintained
- v6 provides improved TypeScript support, better performance, and
simplified APIs
- Removes the deprecated `@react-navigation/compat` package

What changed?

| v5 API | v6 API |
|--------|--------|
| `mode="modal"` prop on Navigator | `screenOptions={{ presentation:
'modal' }}` |
| `headerMode="screen"` prop | Removed (default behavior in v6) |
| `headerMode="none"` prop | `screenOptions={{ headerShown: false }}` |
| `dangerouslyGetParent()` | `getParent()` |
| `dangerouslyGetState()` | `getState()` |
| `NavigationContainerRef` | `NavigationContainerRef<ParamListBase>` |

Dependencies updated:
- `@react-navigation/bottom-tabs`: `^5.11.11` → `^6.6.1`
- `@react-navigation/native`: `^5.9.4` → `^6.1.18`
- `@react-navigation/stack`: `^5.14.5` → `^6.4.1`
- Removed `@react-navigation/compat` (deprecated v5 compatibility
package)

## **Changelog**

CHANGELOG entry: null

## **Related issues**

fixes: [React Navigation v6
Migration](#23767)

## **Manual testing steps**

```gherkin
Feature: React Navigation v6 Migration

  Scenario: user navigates between main tabs
    Given the app is launched and user is logged in
    When user taps on each tab (Wallet, Browser, Activity, etc.)
    Then each tab screen renders correctly with proper animations

  Scenario: user opens a modal screen
    Given the user is on the Wallet screen
    When user triggers a modal (e.g., WalletActions, NetworkSelector)
    Then the modal presents with correct slide-up animation
    And the modal dismisses correctly when closed

  Scenario: user navigates with back button
    Given the user has navigated deep into a stack (e.g., Settings > Security)
    When user presses the back button or swipes back
    Then navigation returns to the previous screen correctly

  Scenario: user opens bottom sheets
    Given the user is on any screen with bottom sheet functionality
    When user triggers a bottom sheet (e.g., Account Connect, Token Sort)
    Then the bottom sheet presents correctly over the current screen
    And background content remains visible behind transparent areas
```

## **Screenshots/Recordings**

### **Before**

N/A - No visual changes expected

### **After**

No visual changes expected. To ensure that the ui has not changed
#27385 was created to
view the comparison of ui through the flow via visual regression

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **High Risk**
> Touches core navigation structure and presentation settings across
many stacks/modals, so regressions could break routing, back behavior,
or modal/sheet presentation. Changes also alter theming/background
handling, which can cause subtle UI layering issues.
> 
> **Overview**
> Updates app navigation to React Navigation v6 patterns by removing
deprecated navigator props like `mode` and moving modal behavior to
`screenOptions.presentation` (and related per-screen options), while
centralizing `clearStackNavigatorOptions` and adjusting many flows (App,
MainNavigator, RootModalFlow, rewards/browser/etc.) to set appropriate
`cardStyle` backgrounds.
> 
> Refactors navigation typings (e.g., `TabBarProps`/descriptors and
`NavigationContainerRef<ParamListBase>`), hardens `TabBar` against
missing descriptors, and expands unit tests/snapshots to cover tab
visibility/callbacks/on-leave behavior plus broad route/screen
registration validation. NavigationContainer theme background is set to
`transparent` to support transparent modals, shifting responsibility for
background color to screens.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b6a3bcb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ng cp-7.72.0 (#28147)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Fixes a regression where the Claim bonus CTA for mUSD could remain
visible after a successful claim and allow reopening claim flow with
effectively no claimable value.

The solution introduces a post-claim lock in useMerklBonusClaim, then
unlocks that CTA after reward data is refreshed (manual pull-to-refresh,
section refresh/remount, or periodic auto-refresh). It also fixes stale
reward state handling so old claimable values are cleared when reward
fetch returns no matching reward.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Fixed an issue where the mUSD Claim bonus button could
remain visible after claiming and trigger another claim flow.

## **Related issues**

Fixes: #28135

## **Manual testing steps**

```gherkin
Feature: mUSD claim bonus CTA state lifecycle

  Scenario: CTA hides after successful claim and reappears after refresh when claimable again
    Given user has claimable mUSD bonus
    And user is on Homepage with Cash section visible
    When user taps "Claim bonus" and confirms the transaction
    Then loader is shown briefly
    And "Claim bonus" is hidden after successful submission

    When user pulls to refresh Homepage
    Then Cash section refreshes
    And claim bonus eligibility is re-evaluated

    When sufficient time passes for auto-refresh interval
    Then claim bonus eligibility is re-evaluated automatically

  Scenario: stale claimable state is cleared
    Given previous claimable reward was shown
    When rewards fetch returns no matching reward
    Then "Claim bonus" is not shown
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches claim CTA gating and introduces a periodic fetch interval;
incorrect locking/versioning could hide the CTA or increase background
network activity unexpectedly.
> 
> **Overview**
> Fixes the mUSD Merkl “Claim bonus” CTA lifecycle by adding a
**post-claim session lock** in `useMerklBonusClaim` that hides the CTA
after a successful claim submission and only re-enables it after rewards
data has refreshed (via a new `rewardsFetchVersion`).
> 
> Enhances `useMerklRewards` with **auto-refresh (60s)**, a
`rewardsFetchVersion` counter, and clearing of stale `claimableReward`
when a refetch returns no matching reward; the Homepage now wires
`CashSection` into the global refresh flow and exposes a section
`refresh()` that forces a remount of the cash row to reset claim state.
Tests were updated/added to cover the lock/unlock behavior, stale
clearing, interval cleanup, version increments, and cash row remount on
refresh.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
67ccc05. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Add info section for money account deposits.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/CONF-1104

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**
<img width="398" height="852" alt="Screenshot 2026-03-27 at 8 13 12 PM"
src="https://github.com/user-attachments/assets/87162fcd-e4b7-48c2-9f80-75faa6eb1024"
/>

## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [X] I've included tests if applicable
- [X] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [X] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches the confirmation UX for `TransactionType.moneyAccountDeposit`,
including hiding the footer by default and suppressing the alert banner,
which could impact users’ ability to review/confirm if the transaction
type is misclassified or the new UI path has gaps.
> 
> **Overview**
> Adds a dedicated `MoneyAccountDepositInfo` section for
`TransactionType.moneyAccountDeposit`, wiring it into the confirmation
`Info` switch and setting a new navbar title key.
> 
> Updates confirmation behavior for money account deposits to use the
redesigned/full-screen confirmation flow, hide the footer by default,
and exclude these transactions from the `AlertBanner` display.
Adds/extends unit tests and introduces the new
`Routes.MONEY_ACCOUNT.ROOT` plus an English string for the new
confirmation title.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b31d9c2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
)

I separated our Crowdin workflow files into two: one to upload updated
source strings (English) to Crowdin, and the other to pull down
completed and approved translations, which generates a PR that we will
merge alongside releases.

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Updated Crowdin workflow files**

I separated our Crowdin workflow files into two: one to upload updated
source strings (English) to Crowdin, and the other to pull down
completed and approved translations, which generates a PR that we will
merge alongside releases. I also added the "chore" prefix to the names
of the PRs to improve our merging process.

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
Having two separate workflows allows us more control over when
translations are pulled down from Crowdin, which will streamline our
process as we aim to align translation PRs with the releases that the
strings pertain to.
-->

## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
- [ ] 

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk workflow-only change that alters when Crowdin sync runs and
how translation PRs are created; main risk is misconfiguration leading
to missed uploads/downloads.
> 
> **Overview**
> Splits the Crowdin GitHub Actions automation into two workflows: a
`push`-triggered job that **only uploads source strings** to Crowdin,
and a separate scheduled/manual job that **downloads only approved
translations**.
> 
> The new download workflow creates translation update PRs titled
`chore: New Crowdin Translations by GitHub Action`, while the upload
workflow disables translation downloads and adds a short job timeout for
both jobs.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
555c5ad. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
This PR bumps the webdriverio dependencies to 9.27.0 to then be used in
#27939.
This bump brings significant improvements on the Appium service.

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MMQA-1454

## **Manual testing steps**
N/A

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
N/A
<!-- [screenshots/recordings] -->

### **After**
N/A
<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
…d settings to useAnalytics (#27855)

## **Description**

<!-- 
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Part of the C3 analytics migration (#26686). This PR covers the
navigation hook and global test setup cleanup.

**What changed:**

- **`useConnectionHandler.tsx`**: replaces `useMetrics` with
`useAnalytics` — the tracked events (`CONNECTION_DROPPED`,
`CONNECTION_RESTORED`) and navigation behaviour are unchanged
- **`useConnectionHandler.test.ts`**: updates mocks from
`useMetrics`/`MetricsEventBuilder` to
`useAnalytics`/`AnalyticsEventBuilder` using `jest.mocked()` and
`createMockUseAnalyticsHook`
- **`testSetup.js`**: removes the global `withAnalyticsAwareness` HOC
mock — the HOC is being deprecated and no longer needs a global stub

The rest of the original scope (TabBar, security/wallet UI components,
Settings, Bridge) has been split into separate PRs for easier review by
the respective code owners:
- [#27983](#27983) —
TabBar (`@MetaMask/design-system-engineers`)
- [#27984](#27984) —
Security/wallet UI components & Settings (`@MetaMask/mobile-core-ux`)
- [#27985](#27985) —
Bridge hook (`@MetaMask/swaps-engineers`)

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Ref: #26814

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk refactor limited to analytics plumbing and Jest mocks;
navigation timing and tracked event names remain the same.
> 
> **Overview**
> Updates `useConnectionHandler` to call `useAnalytics` (instead of
`useMetrics`) while keeping the same offline navigation timeout and
emitting the same `MetaMetricsEvents` for connection dropped/restored.
> 
> Adjusts `useConnectionHandler.test.ts` to mock `useAnalytics` via
`createMockUseAnalyticsHook` and to build assertions with
`AnalyticsEventBuilder`, and removes the now-unneeded global
`withAnalyticsAwareness` HOC mock from `testSetup.js`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
21fe914. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…#28109)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Integrates the Predict "pay with any token" flow into the shared
confirmation `PayWithModal`, enabling users to pay for prediction market
orders using any token (not just their Predict balance).

When a `predictDepositAndOrder` transaction is active, the Pay With
modal now:

- Prepends a "Predict balance" option at the top of the token list (via
`usePredictBalanceTokenFilter`)
- Routes token selection through
`PredictController.selectPaymentToken()` instead of the generic
`setPayToken` path
- Hides the network filter (Predict operates on a single chain —
Polygon)

This wires the confirmation layer into the existing Predict active order
lifecycle (`PREVIEW → PAY_WITH_ANY_TOKEN → DEPOSITING → PLACING_ORDER →
SUCCESS`) without changing the Predict controller or hooks themselves.

## **Changes**

### `pay-with-modal.tsx`

- Imports and calls `usePredictPaymentToken` and
`usePredictBalanceTokenFilter` hooks
- Detects Predict context via `hasTransactionType(transactionMeta,
[TransactionType.predictDepositAndOrder])`
- Intercepts `onTokenPress` to route through
`onPredictPaymentTokenChange` for both single-token and multi-token
selection paths
- Applies `predictBalanceTokenFilter` to the available tokens list when
in Predict context

### `confirmations.ts`

- Adds `TransactionType.predictDepositAndOrder` to:
- `REDESIGNED_TRANSACTION_TYPES` — enables the redesigned confirmation
UI
  - `FULL_SCREEN_CONFIRMATIONS` — renders as a full-screen confirmation
- `HIDE_NETWORK_FILTER_TYPES` — hides the network filter in the Pay With
modal

### `NotificationManager.js`

- Adds `TransactionType.predictDepositAndOrder` to
`SKIP_NOTIFICATION_TRANSACTION_TYPES` so system notifications are
suppressed (Predict manages its own toast notifications via
`usePredictOrders`)

### `pay-with-modal.test.tsx`

- Mocks `usePredictPaymentToken` and `usePredictBalanceTokenFilter`
hooks
- Sets up default mock return values matching the hook interfaces

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Moderate risk because it changes pay-token selection behavior and UI
filtering for a new transaction type, and alters
notification-suppression rules which could affect user feedback if
misclassified.
> 
> **Overview**
> Enables Predict `predictDepositAndOrder` confirmations to use the
shared `PayWithModal` flow, including hiding the network filter and
applying a Predict-specific token list filter.
> 
> When in Predict context, token selection is routed through
`usePredictPaymentToken().onPaymentTokenChange` instead of the generic
`setPayToken` path, and tests were updated to cover the new Predict
selection/filtering behavior.
> 
> Adds `TransactionType.predictDepositAndOrder` to confirmation type
allowlists (`REDESIGNED_TRANSACTION_TYPES`, `FULL_SCREEN_CONFIRMATIONS`,
`HIDE_NETWORK_FILTER_TYPES`) and to `NotificationManager`'s
`SKIP_NOTIFICATION_TRANSACTION_TYPES`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
53d9449. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Prevent the Market Insights background animation from interrupting audio
already playing on the device.

The screen uses a muted `react-native-video` animation, but on iOS that
video can still take over the app audio session and stop music playback
from Bluetooth headphones or device speakers. This change configures the
background video to obey the silent switch and mix with other audio so
opening Market Insights no longer pauses the user’s music.

The test mock for `react-native-video` was also updated to forward props
so the view test can assert the audio-session configuration.

## **Changelog**

CHANGELOG entry: Fixed an issue where opening Market Insights could
pause audio already playing on the device.


<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->



## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches media playback configuration (`react-native-video`) which can
affect audio behavior across platforms, but the change is small and
covered by a targeted unit test.
> 
> **Overview**
> Prevents the Market Insights muted background animation from taking
over the app audio session by configuring `react-native-video` to
`ignoreSilentSwitch="obey"` and `mixWithOthers="mix"`.
> 
> Updates the `react-native-video` Jest mock to forward arbitrary props,
and adds a view test asserting the new audio-mixing configuration on the
background video.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
96bed41. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
* Removes the `importSrpWordSuggestion` remote flag and all code that
read it. The BIP39 word-suggestion bar experiment is complete, so the
app no longer depends on remote config flag for that UI.
* Jra: https://consensyssoftware.atlassian.net/browse/TO-647

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Import SRP screens always show BIP39 word suggestions
when the keyboard is open, with no remote feature flag

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Import SRP BIP39 word suggestions bar

 Scenario: Onboarding import wallet shows word suggestions while typing SRP
    Given the user is on Import from SRP
    And the keyboard is open
    When the user types partial words in the SRP field
    Then BIP39 word suggestions are shown and can be selected

  Scenario: Import new SRP (multi-SRP) shows word suggestions while typing
    Given the user is on Import New SRP
    And the keyboard is open
    When the user types partial words in the SRP field
    Then BIP39 word suggestions are shown and can be selected

```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**


https://github.com/user-attachments/assets/8426a0a8-11d6-4f24-8eb6-b98208f584af



https://github.com/user-attachments/assets/11bf056f-a203-4fd1-a90c-27fa27982d76


<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Moderate risk because it changes onboarding wallet-import UI behavior
and removes a remote kill-switch, but the logic change is small and
localized to SRP import screens and flag plumbing.
> 
> **Overview**
> Removes the `importSrpWordSuggestion` remote feature flag end-to-end
(feature flag enum entry, selector implementation + tests, and registry
entry).
> 
> Updates both SRP import flows (`ImportFromSecretRecoveryPhrase` and
`ImportNewSecretRecoveryPhrase`) to *always* render `SrpWordSuggestions`
when the keyboard is visible (and on step 0 where applicable), and drops
the associated feature-flag mocks from the screen tests.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
24f7f6a. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…28114)

## **Description**

Migrate the local `MainRoutes` component in Ramp Deposit routes from
prop-based route access to `useRoute()` hook, eliminating the `type
ScreenComponent = React.ComponentType<any>` escape hatch.

Part of the React Navigation v6 migration effort to remove
`no-explicit-any` violations from route files.

**Changes:**
- **`routes/index.tsx`**: Switch `MainRoutes` to `useRoute()`, remove
`MainRoutesProps`, `ScreenComponent` alias, and cast

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

N/A — pure refactoring with no user-facing behavior change.

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

Made with [Cursor](https://cursor.com)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk refactor limited to navigation param plumbing; behavior
should remain unchanged aside from potential typing/runtime differences
if the route context is misconfigured.
> 
> **Overview**
> Refactors `app/components/UI/Ramp/Deposit/routes/index.tsx` so
`MainRoutes` no longer accepts a `route` prop and instead pulls
`DepositNavigationParams` from React Navigation via `useRoute()`.
> 
> This removes the local `MainRoutesProps` typing and updates imports
accordingly, aiming to simplify typing and reduce `any`-style escape
hatches during the React Navigation v6 migration.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b1db237. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Mar 31, 2026
@pull pull Bot added the ⤵️ pull label Mar 31, 2026
@pull pull Bot merged commit 8aa5a56 into Reality2byte:main Mar 31, 2026
3 of 15 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.